import org.omg.PortableServer.ForwardRequest;

import java.util.ArrayList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-05-04
 * Time: 16:55
 */
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        // 先整体异或, 得到的结果就是那两个只出现一次的数字的异或
        int total = 0;
        for (int x: array) {
            total ^= x;
        }
        // 然后找这个结果中的为 1 的某个 bit
        // 这一位为 1 就说明只出现一次的那两个数字中一定一个 这个 bit 为 1, 另一个为 0
        // 根据这个区别就能将两个数字分开

        // 方法一 : 挨个 bit 位找
        /* int bit = 0;
         for (int i = 0; i < 32; i++) {
             if (((total >> i) & 1) == 1){
                 bit = i;
                 break;
             }
         }*/

        // 方法二 : 直接对结果进行异或, 正数与其对应的负数进行异或
        // 那么得到的结果中只有一个 bit 位出现了 1 , 而这一位就是能够将两个数字进行区分的那一位
        total &= (-total);
        num1[0] = 0;
        num2[0] = 0;
        // 区分出来后, 要做的就是找只出现一次的那一个数字, 只需进行全部的异或
        for (int x: array) {
            if ((x & total) != 0 ){
                num1[0] ^= x;
            }else{
                num2[0] ^= x;
            }
        }
    }
}
